package com.yanqu.data.analytics;

import com.yanqu.data.analytics.consumer.ConsumerQueueOperate;

import java.util.Map;

public interface Provider {

    /**
     * 删除用户，此操作不可逆
     *
     * @param accountId  账号 ID
     * @param distinctId 访客 ID
     */
    void user_del(String accountId, String distinctId);

    /**
     * 用户属性修改，只支持数字属性增加的接口
     *
     * @param accountId  账号 ID
     * @param distinctId 访客 ID
     * @param properties 用户属性
     */
    void user_add(String accountId, String distinctId, Map<String, Object> properties);

    /**
     * 设置用户属性. 如果该属性已经存在，该操作无效.
     *
     * @param accountId  账号 ID
     * @param distinctId 访客 ID
     * @param properties 用户属性
     */
    void user_setOnce(String accountId, String distinctId, Map<String, Object> properties);

    /**
     * 设置用户属性. 如果属性已经存在，则覆盖; 否则，新创建用户属性
     *
     * @param accountId  账号 ID
     * @param distinctId 访客 ID
     * @param properties 用户属性
     */
    void user_set(String accountId, String distinctId, Map<String, Object> properties);

    /**
     * 删除用户指定的属性
     *
     * @param accountId  账号 ID
     * @param distinctId 访客 ID
     * @param properties 用户属性
     */
    void user_unset(String accountId, String distinctId, String... properties);

    /**
     * 用户的数组类型的属性追加
     *
     * @param accountId  账号 ID
     * @param distinctId 访客 ID
     * @param properties 用户属性
     */
    void user_append(String accountId, String distinctId, Map<String, Object> properties);

    /**
     * 上报事件
     *
     * @param accountId  账号 ID
     * @param distinctId 访客ID
     * @param eventName  事件名称
     * @param properties 事件属性
     */
    void track(String accountId, String distinctId, String eventName, Map<String, Object> properties);

    /**
     *
     * @param accountId
     * @param distinctId
     * @param eventName
     * @param eventId  事件id
     * @param properties
     */
    void track_update(String accountId, String distinctId, String eventName, String eventId, Map<String, Object> properties);

    /**
     * @param accountId
     * @param distinctId
     * @param eventName
     * @param eventId  事件id
     * @param properties
     */
    void track_overwrite(String accountId, String distinctId, String eventName, String eventId, Map<String, Object> properties);


    /**
     * 立即上报数据到接收端
     */
    void flush();

    /**
     * 关闭并退出 sdk 所有线程，停止前会清空所有本地数据
     */
    void close();

    /**
     * 返回具体实现类
     */
    ConsumerQueueOperate getQueueOperate();
}
